iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
2
Mobile Development

Android TDD 測試驅動開發系列 第 8

Day08 - 在Android 上的測試

  • 分享至 

  • xImage
  •  

這個單元,我們要開始介紹在Android 上的測試。

Android 的測試分為

  • Local unit test
  • Instrumented unit test
  • UI test

Local unit test
Local unit test:只在Local 的機器上執行,這些測試在編譯後就在JVM(Java Virtual Machine)執行。這種單元測試不依賴於Android 框架,也就是不需要裝APK,執行的速度也快。在上個單元,我們所提到的測試都是屬於此類的單元測試。

Instrumented unit test
Instrumented unit test 也是單元測試,只是需要Android裝置或模擬器上執行。這些測試需要Android framework,像是Context等等。執行的速度慢,因為你必須產生APK並安裝在裝置或模擬器上執行。

UI test
UI 測試用來驗證使用者的操作行為,像點擊按鈕,輸入文字,基本上就是使用者會做的事,當然一定要用到Android framework,因為你會直接接觸到UI,也一定要安裝在Android裝置或模擬器。這些UI測試,我們會使用Espresso來測試

Local unit test 總是我們最優先考量的,因為效能最好,測試最穩定。如果有與Android framework相依的,可以使用Robolectric這個第三方元件,來模擬Android framework。也就是可以像Local unit tests一樣在JVM就可以執行。

這三種測試程式放在以下目錄:

  • app/src/main/java - Android 程式碼,通常會以Production code來稱像這樣的程式。
  • app/src/test/java - Local Unit tests,在JVM執行的單元測試。
  • app/src/androidTest/java - Instrumented unit tests 、UI 測試,需要在Android Device上執行

在Google I/O 2017的這個影片,說明了在Android的測試金字塔
https://ithelp.ithome.com.tw/upload/images/20190922/201118966Cbz5IOfz1.png
圖片來源 Google IO 2017

最底層的是單元測試,這裡的測試速度應該要很快,會在你的本機執行,也就是在JVM(Java Virtual Machine)。執行的速度快,因為不需要Android,基本上就只是執行Java的程式。這裡的測試通常不會執行在真的手機,你會用Mock、Fake的方式來讓你可以在本機執行。

第二層及第三層則適合在實體裝置或模擬器執行,這兩層的執行會讓你知道你的App是真的可以在手機裡執行的。但這裡的測試當有錯時,不容易找到原因。而且測試的速度較慢,因為你會需要build一個apk出來並裝在實體裝置或模擬器上執行。

寫在單元測試的商業邏輯重要,但UI test、Instrumented test測試一樣重要,因為只要有任一出錯,使用者體驗就是不好。Google 則是建議 70% small, 20 % medium, and 10 % large。因為測試也是有代價的,也就是執行測試花時間。

事實上,測試金字塔只是要告訴大家測試自動化要有不同的層度,每一層的效益、花的時間都是不一樣的。希望大家在投入資源時能做有效的運用。

在這個單元「在Android 上進行單元測試」,我們將介紹這幾種Android的測試。另外在第一篇,我們曾提到了Android之所以難以測試的其中一個原因就是與Android framework相依,將會帶著大家來試著解開這些Android的相依。這裡就會用到之前所提到的依賴注入、Mock、Stub、Mockito這些方法。如果你還不熟悉這些的話,建議大家再回到前幾篇將依賴注入、假物件熟悉後再繼續這個單元。

出版書:

Android TDD 測試驅動開發:從 UnitTest、TDD 到 DevOps 實踐


上一篇
Day07 - 單元測試小結
下一篇
Day09 - 第一個Android 單元測試
系列文
Android TDD 測試驅動開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言